/*******************************************************************************
 * 版权：北京润尼尔网络科技有限公司，保留所有版权<br>
 * 版本：v1.0.0<br>
 * 文件：base_object11.js<br>
 * 日期：2016年7月25日<br>
 * 作者: 杨顺强<br>
 * 功能： 定义基本类<br>
 * 
 * 修改记录：<br>
 * 日期 描述 更新功能<br>
 ******************************************************************************/

;(function(){
	
	
	//定义名称空间
	var namespace ={};
	
	//创建名称空间：Rainier.Basic
	//根据Node.js后端还是web前端判断应该创建名称空间的空对象
	if((typeof(window) !== "undefined")){
		makeNamespace(window,"Rainier.Basic");
		namespace = window.Rainier.Basic;
	}else{
		require("../utils/nsutils.js").makeNamespace(exports,"Rainier.Basic");
		var ml_UUID			= require('../utils/uuid_utils.js');
		var ml_interface	= require("./interface.js");
		var ml_property		= require("./property.js");
		var ml_class		= require("./class.js");
		namespace.Interface = ml_interface.Interface;
		namespace.Property  = ml_property.Property;
		namespace.Class		= ml_class.Class;
		namespace.UUID		= ml_UUID.UUID;
	}  
			
	//名称空间定义：Rainier.Basic
	
	namespace.BaseObject = namespace.Class.extend({
		//定义类的名字
		NAME:"BaseObject",
		
		//完成类的初始化
		init:function(){

			this.m_sUuid = (new namespace.UUID()).v4();
			
			this.m_support = new namespace.Property.PropertyChangeSupport(this);
			
			//检测对象时候实现了相应的方法
			this._checkInterface();
		},
		
		/**
		 * 函数名称：addPropertyChangeListener<br>
		 * 函数功能：实现addPropertyChangeListener接口函数<br>
		 * 参数输入：sName 	侦听器名称<br>
		 * 参数输入：listener	侦听器<br>
		 * 函数返回：无<br>
		 * 异常信息：无<br>
		 */
		addPropertyChangeListener:function(sName, objListener){
			this.m_support.addPropertyChangeListener(sName, objListener);
		},
		
		/**
		 * 函数名称：removePropertyChangeListener<br>
		 * 函数功能：删除事件侦听器<br>
		 * 参数输入：sName 侦听器名称<br>
		 * 函数返回：无<br>
		 * 异常信息：无<br>
		 */
		removePropertyChangeListener : function(sName){
			this.m_support.removePropertyChangeListener(sName);
		},
		
		/**
		 * 函数名称：firePropertyChange<br>
		 * 函数功能：实现firePropertyChange接口函数<br>
		 * 参数输入：sEvtName 		事件名称<br>
		 * 参数输入：objOldValue	设置前值<br>
		 * 参数输入：objNewValue	设置后值<br>
		 * 参数输入：objOmitted	忽略的侦听器<br>
		 * 函数返回：无<br>
		 * 异常信息：无<br>
		 */
		firePropertyChange:function(sEvtName,objOldValue,objNewValue,objOmitted){
			this.m_support.firePropertyChangeEvent(
					sEvtName,
					objOldValue,
					objNewValue,
					objOmitted
				);
		},
		
		/**
		 * 函数名称：setUuid<br>
		 * 函数功能：设置js类对象的uuid值<br>
		 * 参数输入 uuid：
		 * 参数输出：<br>
		 * 函数返回：无<br>
		 * 异常信息：无<br>
		 */
		setUuid:function(sUuid){
			var _this = this;
			var sOldUuid = this.m_sUuid;
			this.m_sUuid = sUuid;
			this.firePropertyChange(
					namespace.BaseObject.SC_S_EVENT_UUID_CHANGED, 
					sOldUuid, 
					sUuid
					);
		},
		
		/**
		 * 函数名称：getUuid<br>
		 * 函数功能：获取类对象的uuid值<br>
		 * 参数输入：无<br>
		 * 参数输出：无<br>
		 * 函数返回：返回类对象的uuid值<br>
		 * 异常信息：无<br>
		 */
		getUuid:function(){
			return this.m_sUuid;
		},
		
		/**
		 * 函数名称：_checkInterface 私有函数。<br>
		 * 函数功能：检测类对象是否实现了相应借口中相应的方法<br>
		 * 参数输入：无<br>
		 * 参数输出：无<br>
		 * 函数返回：无<br>
		 * 异常信息：无<br>
		 */
		_checkInterface:function(){
			var _this = this;
			namespace.Interface.checkImplements(_this,namespace.Property.g_InterPropertyChangeSupport);
		},
		
		/**
		 * 函数名称：clone<br>
		 * 函数功能：执行复制操作<br>
		 * 函数返回：BaseObject<br>
		 * 异常信息：无<br>
		 */
		clone : function(){
			return $.extend(true,{},this);
		}
	});
	
	//常量定义：对象uuid改变事件
	namespace.BaseObject.SC_S_EVENT_UUID_CHANGED = "EVENT_UUID_CHANGED";
	
	if (typeof exports !== "undefined") {
		exports.BaseObject = namespace.BaseObject;
	} 
	
})();